using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace Cuenta
{
    class Program
    {
        static void Main(string[] args)
        {
            Cuenta cta = new Cuenta(1000);
            Thread[] hilos = new Thread[10];
            for (int i = 0; i < 10; i++)
            {
                hilos[i] = new Thread(cta.RealizarTransacciones);
            }
            for (int i = 0; i < 10; i++)
            {
                hilos[i].Start();
            }

            Console.ReadLine();
        }
    }

    class Cuenta
    {
        private int saldo;

        public Cuenta(int monto_inicial)
        {
            saldo = monto_inicial;
        }

        public object bloqueo=new object();

        public int Retiro(int monto) {
            lock (bloqueo) {
                if (saldo >= monto)
                {
                    Console.WriteLine("Saldo (Antes): " + saldo);
                    Console.WriteLine("Retiro: " + monto);
                    saldo = saldo - monto;
                    Console.WriteLine("Saldo (Despues): " + saldo);
                }
                else {
                    Console.WriteLine(
                        "Saldo Insuficiente: saldo={0}, retiro={1}", 
                        saldo, 
                        monto);
                }
            }

            return monto;
        }

        Random r = new Random();
        public void RealizarTransacciones(){
            for (int i = 0; i < 10; i++)
            {                
                Retiro(r.Next(1, 100));
            }
        }
    }
}
